package com.woniu.mealsService.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.woniu.mealsService.mapper.FoodTypeMapper;
import com.woniu.mealsService.model.FoodType;
import com.woniu.mealsService.model.Store;
import com.woniu.mealsService.service.FoodTypeService;
import com.woniu.mealsService.service.StoreService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 菜品类型表 服务实现类
 * </p>
 *
 * @author 吕雨泽
 * @since 2024年12月06日
 */
@Service
public class FoodTypeServiceImpl extends ServiceImpl<FoodTypeMapper, FoodType> implements FoodTypeService {
    @Autowired
    private FoodTypeMapper foodTypeMapper;
    @Autowired
    private StoreService storeService;
    /**
     * 创建食品类型
     *
     * @param changeUserId 操作用户的ID，用于关联商店和记录操作
     * @param foodTypeName 食品类型的名称，用于创建新的食品类型
     *
     * 此方法首先根据提供的用户ID查找对应的商店，确保商店存在，
     * 然后使用食品类型名称创建一个新的食品类型实例，并设置相关的操作用户信息和时间戳，
     * 最后将这个新的食品类型保存到数据库中
     */
    @Override
    public void createFoodType(String changeUserId, String foodTypeName) {
        // 根据用户ID查询商店，确保操作的用户是一个有效的商店
        Store store = storeService.getOne(new QueryWrapper<Store>().eq("user_id", changeUserId));
        if(store==null){
            // 如果没有找到对应的商店，抛出异常
            throw new RuntimeException("商家不存在");
        }
        // 获取商店的用户名，用于记录操作用户
        String userName=store.getUserName();
        // 创建一个新的食品类型实例
        FoodType foodType=new FoodType();
        // 设置食品类型的名称
        foodType.setFoodTypeName(foodTypeName);
        // 设置商店的ID
        foodType.setStoreId(store.getStoreId().toString());
        // 设置操作用户的ID
        foodType.setChangeUserId(changeUserId);
        // 设置操作用户的用户名
        foodType.setChangeUser(userName);
        // 设置创建时间为当前时间
        foodType.setCreatTime(LocalDateTime.now());
        // 设置更新时间为当前时间
        foodType.setUpdateTime(LocalDateTime.now());
        // 将新的食品类型保存到数据库中
        foodTypeMapper.insert(foodType);
    }

    /**
     * 根据店铺ID搜索食品类型列表，并进行分页处理
     *
     * @param storeId 店铺ID，用于筛选属于特定店铺的食品类型
     * @param pageNum 页码，表示当前查询的是第几页数据
     * @param pageSize 每页大小，表示每页最多包含的食品类型数量
     * @return 返回一个包含食品类型列表的PageInfo对象，用于展示分页查询结果
     */
    @Override
    public PageInfo<FoodType> searchFoodTypeList(String storeId, Integer pageNum, Integer pageSize) {
        // 开始分页查询，传入页码和每页大小
        PageHelper.startPage(pageNum,pageSize);
        // 调用Mapper方法，根据店铺ID搜索食品类型列表
        List<FoodType> foodTypes = foodTypeMapper.searchFoodTypeList(storeId);
        // 将查询结果封装到PageInfo对象中并返回
        return new PageInfo<>(foodTypes);
    }

    /**
     * 删除菜品类型
     *
     * @param changeUserId 操作用户的ID，用于记录是谁进行了删除操作
     * @param foodTypeId 要删除的菜品类型的ID，用于指定删除的目标
     * @throws RuntimeException 如果该类型下有菜品，无法删除，则抛出运行时异常
     */
    @Override
    public void deleteFoodType(String changeUserId, Long foodTypeId) {
        // 判断该商品是否存在
        FoodType foodType = foodTypeMapper.searchFoodTypeById(foodTypeId);
        if(foodType==null){
            // 如果不存在，抛出异常
            throw new RuntimeException("该类型不存在");
        }
        if(!foodType.getChangeUserId().equals(changeUserId)){
            // 如果操作用户不是创建者，抛出异常
            throw new RuntimeException("不是创建者，无法删除");
        }
        // 尝试删除菜品类型，如果类型下有菜品，则不进行实际删除操作
        Integer count = foodTypeMapper.deleteFoodType(foodTypeId);
        // 检查删除操作是否成功，如果未成功，则抛出异常提示用户
        if(count==0){
            throw new RuntimeException("该类型下有菜品，无法删除");
        }
    }

    /**
     * 根据食物类型ID搜索食物类型
     *
     * 此方法通过调用FoodTypeMapper中的searchFoodTypeById方法来实现
     * 它接收一个食物类型ID作为参数，并返回对应的食物类型对象
     *
     * @param foodTypeId 食物类型ID，用于搜索特定的食物类型
     * @return 返回找到的食物类型对象，如果没有找到则返回null
     */
    @Override
    public FoodType searchFoodTypeById(Long foodTypeId) {
        return foodTypeMapper.searchFoodTypeById(foodTypeId);
    }

}
